from public import print_1

print_1('函数',True)
print_1('可变长参数')
"""

可变长参数是指长度（数量）可变的参数，函数参数不可知的时候，就需要写一个可变长参数的函数。

（1）可变长参数在形参的作用

如果此时有一串数据要传入函数，不知道有多少个，那么应该如何定义函数呢？

① *args

可以接受多余的位置参数，并将多余参数转换成元组类型赋值给 * 后面的形参 args（* 后的形参名约定俗成为 args）。

位置参数只能多，不能少；
定义可变长形参时，*args 要放在位置参数后面。
"""
def print_obj(a, b, *args):
    print(a, b, args)
print_obj(1, 2, 3)
print_obj(1, 2, 3, 4, 5, 6)

"""
 **kwargs
 可以接受多余的关键字参数，并将多余参数转换成字典类型赋值给 ** 后面的形参 kwargs（** 后的形参名约定俗成为 kwargs）。

位置参数要对应；
多余的参数必须要用关键字传参；
定义可变长形参时，**kwargs 要放在位置参数后面。
"""
def print_obj(a, b, **kwargs):
    print(a, b, kwargs)
print_obj(1, 2)
print_obj(1, 2, c=3)
print_obj(1, 2, c=3, d=4, e=5, f=6)

print_1('函数的值传递和引用传递')
"""
形式参数和实际参数
形式参数（形参）：定义函数时，函数名后面括号中的参数就是形式参数；
实际参数（实参）：调用函数时，函数名后面括号中的参数称为实际参数，也就是函数的调用者给函数的参数。
"""

"""
值传递和引用传递
Python 中，根据实际参数的类型不同，函数参数的传递方式可分为两种：

值传递：适用于实参类型为不可变类型（字符串、数字、元组）；
引用传递：适用于实参类型为可变类型（列表，字典）。
值传递和引用传递的区别是，函数参数进行值传递后，若形参的值发生改变，不会影响实参的值；而函数参数继续引用传递后，改变形参的值，实参的值也会一同改变。
"""

print_1('变量作用域')
"""
局部变量和全局变量

局部变量：局部变量是指在函数内部申明的变量，只能在函数内部调用，超过使用范围就会报错。
全局变量：就是在整个 Python 文件中申明的变量，可以在全局使用。
在局部，如果局部变量和全局变量名相同，优先使用局部变量
"""

print_1('获取指定作用域范围中的变量')
name1 = "111"
name2 = "222"
def text1():
    #局部变量
    name1 = "111"
    name2 = "222"
print(globals())

print_1('获取当前作用域内所有变量的字典')
name1 = "111"
name2 = "222"
def text1():
    #局部变量
    name1 = "111"
    name2 = "222"
    print("函数内部的 locals:")
    print(locals())
text1()
print("函数外部的 locals:")
print(locals())

print_1('闭包函数')
"""
在函数嵌套的前提下，内部函数使用了外部函数的变量，并且外部函数返回了内部函数，我们把这个使用外部函数变量的内部函数称为闭包。所以，闭包的构成调条件：

在函数嵌套（函数里面再定义函数）的前提下；
内部函数使用了外部函数的变量（还包括外部函数的参数）；
外部函数返回了内部函数。
"""
# 采用定义闭包函数的方式
def average_obj():
    list_obj = []
    def inner(money):
        list_obj.append(money)
        return sum(list_obj) / len(list_obj)
    return inner

average = average_obj()
print(average(6000))
print(average(7000))
print(average(8000))


print_1('匿名函数')
"""
匿名函数，又称 lambda 函数，常用来表示内部仅包含 1 行表达式的函数
"""
# 普通函数
def addition1(a, b):
    c = a + b
    return c
print(addition1(1, 2))
# 匿名函数
f = lambda d, e: d + e
print(f(1, 2))





